#include <memory>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    shared_ptr<int> p(new int(42)); // 引用计数为 1
    // get 返回一个内置指针，指向智能指针管理的对象
    // 不能 delete 内置指针
    int *q = p.get(); // 正确：但使用 q 时要注意，不要让它管理的指针被释放
    { // 新程序块
        // 未定义：两个独立的 shared_ptr 指向相同的内存
        shared_ptr<int>(q);
    } // 程序块结束，q 被销毁，它指向的内存被释放
    int foo = *p; // 未定义：p 指向的内存已经被释放了
    cout << foo << endl;

    // p = new int(1024);      // 错误：不能将一个指针赋予 shared_ptr
    p.reset(new int(1024)); // 正确：p 指向一个新对象

    // string *p_str = new string("hello");
    // shared_ptr<string> p1(p_str);
    // shared_ptr<string> p2(p_str);
    // cout << "p1.unique: " << p1.unique() << endl; // true

    shared_ptr<string> p1(new string("hello"));
    shared_ptr<string> p2(p1);
    cout << "p1.unique: " << p1.unique() << endl; // false

    string newVal = " world";
    if (!p1.unique())
        p1.reset(new string(*p1)); // 我们不是唯一用户；在改变底层对象之前，要制作一份新的拷贝
    *p1 += newVal; // 现在我们知道自己是唯一的用户，可以改变对象的值
    
    cout << "*p1: " << *p1 << endl;
    cout << "*p2: " << *p2 << endl;
}